9. 回文数

9. 回文数

Similar Question

leading to the advanced question

479. 最大回文数乘积 - 力扣(LeetCode)

564. 寻找最近的回文数 题解 - 力扣(LeetCode)

Solution Tips

由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除

反转整个数再进行判断也可以,而且代码更简洁,因为如果反转溢出,那他一定不是回文数,回文数反转以后一定是它本身,所以一定不会溢出

方案一: 数学

var isPalindrome = function(x: number): boolean {
    // 特殊情况:
    // 如上所述,当 x < 0 时,x 不是回文数。
    // 同样地,如果数字的最后一位是 0,为了使该数字为回文,
    // 则其第一位数字也应该是 0
    // 只有 0 满足这一属性
    if (x < 0 || (x % 10 === 0 && x !== 0)) {
        return false;
    }

    let revertedNumber: number = 0;
    while (x > revertedNumber) {
        revertedNumber = revertedNumber * 10 + x % 10;
        x = Math.floor(x / 10);
    }

    // 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。
    // 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,
    // 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。
    return x === revertedNumber || x === Math.floor(revertedNumber / 10);
};

方案二: 转换为字符串 + 反转一半

  var isPalindrome = function(x) {
    const str = x+''
    // 反转一半,无法搞定小于1的情况
    if(str.length<=1) return true
    const half = str.length>>>1
    const partOne = str.slice(0,half)
    const partTwo = str.slice(-half).split('').reverse().join('')
    return partOne === partTwo
  }

头尾比对

 var isPalindrome = function(x) {
   const str = x+""
   const len =str.length
   for(let i=0;i<len>>>1;i++){
     if(str[i] !== str[len-1-i]) return false
   }
   return true
 }
 var isPalindrome = function(x) {
   const str = x+""
   const arr = [...str]
   const half = arr.length>>>1
   // 不可以在内部length,因为一边 shift和pop,length一直在改变
   for(let i=0;i<half;i++){
       if(arr.shift()!==arr.pop()) return false
   }
   return arr.length<=1
 }
 
 let x = 1001
 console.log(isPalindrome(x))